home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / gfx / 3d / Skulpt_src.lha / sKulpt-src / Ami-Dialogs.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-05  |  62.8 KB  |  1,416 lines

  1. #define STRICT
  2.  
  3. // Includes standard Windows
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>
  9. #include <memory.h>
  10. #include <stdio.h>
  11.  
  12. #include    <stdarg.h>
  13.  
  14. // Includes D3D
  15. #define  D3D_OVERLOADS
  16. #include <ddraw.h>
  17. #include <d3d.h>
  18. #include <d3dx.h>
  19.  
  20. // Includes utilitaires D3D
  21. #include "d3dmath.h"
  22. #include "d3dutil.h"
  23. #include "D3DEnum.h"
  24.  
  25. // Ids Resources
  26. #include "resource.h"
  27.  
  28. // Constantes
  29. #include "const.h"
  30.  
  31. // Types
  32. #include "types.h"
  33.  
  34. // Variables globales projet
  35. #include "vars.h"
  36.  
  37. // Prototypes fonctions autres modules
  38. #include "proto.h"
  39.  
  40. // Macros
  41. #include "macros.h"
  42.  
  43. // Spécifiques module
  44. #include "libraries/gadtools.h"
  45.  
  46. // Variables statiques au module
  47. static SCROLLINFO Si;
  48.  
  49. // Définitions des orientations possibles pour 4 triangles dans 1 carré (A, B, C, D)
  50. typedef int *tridef[3];
  51.  
  52. static int  A[] = { 0, 0 },
  53.             B[] = { 0, 1 },
  54.             C[] = { 1, 1 },
  55.             D[] = { 1, 0 };
  56.  
  57. static tridef   iSW[] = { {A, B, C}, {A, C, B} , {B, C, A}, {B, A, C}, {C, A, B}, {C, B, A} },
  58.                 iNE[] = { {A, D, C}, {A, C, D} , {D, C, A}, {D, A, C}, {C, A, D}, {C, D, A} },
  59.                 iSE[] = { {C, B, D}, {C, D, B} , {B, D, C}, {B, C, D}, {D, C, B}, {D, B, C} },
  60.                 iNW[] = { {A, B, D}, {A, D, B} , {B, D, A}, {B, A, D}, {D, A, B}, {D, B, A} };
  61.  
  62. //////////////////// E C L A I R A G E  G L O B A L //////////////////////////////
  63. BOOL CALLBACK bGlobLightDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  64. {
  65.     int wmId, nPos;
  66.     static D3DCOLOR cbAmbient, cbBack;
  67.     Si.cbSize = sizeof(Si);
  68.  
  69.     switch( uMsg )
  70.     {
  71.     case WM_COMMAND :
  72.          wmId    = LOWORD(wParam);
  73.  
  74.          switch (wmId)
  75.          {
  76.             case IDRESET:    // Restaurer les valeurs initiales
  77.                 // Restaurer les valeurs
  78.                 cAmbient = cbAmbient;
  79.                 cBack = cbBack;
  80.  
  81.                 // Repositionner les états du pipe D3D
  82.                 vSetD3DState();
  83.  
  84.                 // Repositionner les curseurs des sliders
  85.                 Si.fMask = SIF_POS;
  86.                 Si.nPos = (cAmbient & 0xff0000) >> 16;  SetScrollInfo(GetDlgItem(hWnd, IDC_BA), SB_CTL, &Si, TRUE);
  87.                 Si.nPos = (cAmbient & 0x00ff00) >> 8;   SetScrollInfo(GetDlgItem(hWnd, IDC_GA), SB_CTL, &Si, TRUE);
  88.                 Si.nPos =  cAmbient & 0x0000ff;         SetScrollInfo(GetDlgItem(hWnd, IDC_RA), SB_CTL, &Si, TRUE);
  89.                 Si.nPos = (cBack & 0xff0000) >> 16;     SetScrollInfo(GetDlgItem(hWnd, IDC_BF), SB_CTL, &Si, TRUE);
  90.                 Si.nPos = (cBack & 0x00ff00) >> 8;      SetScrollInfo(GetDlgItem(hWnd, IDC_GF), SB_CTL, &Si, TRUE);
  91.                 Si.nPos =  cBack & 0x0000ff;            SetScrollInfo(GetDlgItem(hWnd, IDC_RF), SB_CTL, &Si, TRUE);
  92.  
  93.                 vForce3DRefresh(XDC_MODE_COMPLET);
  94.                 break;
  95.  
  96.             case IDCANCEL:    // Restaurer les valeurs initiales et quitter
  97.                 // Restaurer les valeurs
  98.                 cAmbient = cbAmbient;
  99.                 cBack = cbBack;
  100.  
  101.                 vForce3DRefresh(XDC_MODE_COMPLET);
  102.  
  103.                 // ATTENTION pas de break, on continue...
  104.  
  105.             case IDOK:    // Fin dialogue
  106.                 EndDialog(hWnd, 0);
  107.                 break;
  108.          }
  109.          return TRUE;
  110.          break;
  111.  
  112.      case WM_HSCROLL :    // Scroll slider
  113.          // Récupérer les valeurs de scroll
  114.          nPos = wParam;   // scroll box position
  115.  
  116.          switch(lParam)
  117.          {
  118.              case IDC_BA :
  119.                  cAmbient &= 0xff00ffff;
  120.                  cAmbient |= nPos << 16;
  121.                  // Mettre à jour les variables d'état du pipe D3D
  122.                  vSetD3DState();
  123.                  break;
  124.              case IDC_GA :
  125.                  cAmbient &= 0xffff00ff;
  126.                  cAmbient |= nPos << 8;
  127.                  // Mettre à jour les variables d'état du pipe D3D
  128.                  vSetD3DState();
  129.                  break;
  130.              case IDC_RA :
  131.                  cAmbient &= 0xffffff00;
  132.                  cAmbient |= nPos;
  133.                  // Mettre à jour les variables d'état du pipe D3D
  134.                  vSetD3DState();
  135.                  break;
  136.              case IDC_BF :
  137.                  cBack &= 0xff00ffff;
  138.                  cBack |= nPos << 16;
  139.                  break;
  140.              case IDC_GF :
  141.                  cBack &= 0xffff00ff;
  142.                  cBack |= nPos << 8;
  143.                  break;
  144.              case IDC_RF :
  145.                  cBack &= 0xffffff00;
  146.                  cBack |= nPos;
  147.                  break;
  148.          }
  149.  
  150.           // Redessiner la 3D
  151.           vSetD3DState();
  152.           vForce3DRefresh(XDC_MODE_COMPLET);
  153.  
  154.          return TRUE;
  155.          break;
  156.  
  157.      case WM_INITDIALOG :
  158.          // Positionner les sliders
  159.          Si.fMask = SIF_POS | SIF_RANGE;
  160.          Si.nMin = 0;
  161.          Si.nMax = 255;
  162.  
  163.          Si.nPos = (cAmbient & 0xff0000) >> 16;     SetScrollInfo(GetDlgItem(hWnd, IDC_BA), SB_CTL, &Si, TRUE);
  164.          Si.nPos = (cAmbient & 0x00ff00) >> 8;      SetScrollInfo(GetDlgItem(hWnd, IDC_GA), SB_CTL, &Si, TRUE);
  165.          Si.nPos =  cAmbient & 0x0000ff;            SetScrollInfo(GetDlgItem(hWnd, IDC_RA), SB_CTL, &Si, TRUE);
  166.          Si.nPos = (cBack & 0xff0000) >> 16;        SetScrollInfo(GetDlgItem(hWnd, IDC_BF), SB_CTL, &Si, TRUE);
  167.          Si.nPos = (cBack & 0x00ff00) >> 8;         SetScrollInfo(GetDlgItem(hWnd, IDC_GF), SB_CTL, &Si, TRUE);
  168.          Si.nPos =  cBack & 0x0000ff;               SetScrollInfo(GetDlgItem(hWnd, IDC_RF), SB_CTL, &Si, TRUE);
  169.  
  170.          // Mémoriser les valeurs initiales
  171.          cbAmbient = cAmbient;
  172.          cbBack = cBack;
  173.          return TRUE;
  174.          break;
  175.     }
  176.  
  177.     return FALSE;
  178. }
  179.  
  180. ///////////////////////// S P H E R E /////////////////////////////////////////
  181. BOOL CALLBACK bSphereDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  182. {
  183.      int wmId;
  184.     static int iH = 8, iV = 8, iDlgId;       // Subdivisions horizontales & verticales
  185.      char cBuf[12];
  186.     static BOOL b2Params;
  187.  
  188.      switch( uMsg )
  189.     {
  190.      case WM_COMMAND :
  191.         wmId    = LOWORD(wParam);
  192.  
  193.         switch (wmId)
  194.         {
  195.              case IDCANCEL:
  196.                  EndDialog(hWnd, -1);
  197.                  break;
  198.  
  199.             case IDOK:  // Fin dialogue
  200.                  SendDlgItemMessage(hWnd, IDC_SH, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); iH = atoi(cBuf);
  201.                  if (b2Params) { SendDlgItemMessage(hWnd, IDC_SV, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); iV = atoi(cBuf); }
  202.                  if ((iH > 0) && (iV > 0)) // Ajouter la sphère ou l'hémisphère ou le tore
  203.                 {
  204.                     switch(iDlgId)
  205.                     {
  206.                         case ID_EDITION_AJOUTER_SPHRE:
  207.                         case ID_EDITION_AJOUTER_HMISPHRE:
  208.                             vAddSphere(Cursor1, (fXmax - fXmin) / 4., iH, iV, (iDlgId == ID_EDITION_AJOUTER_HMISPHRE));
  209.                             break;
  210.  
  211.                         case ID_EDITION_AJOUTER_TORE:
  212.                             vAddTorus(Cursor1, (fXmax - fXmin) / 4., (fXmax - fXmin) / 6., iH, iV);
  213.                             break;
  214.  
  215.                         case ID_EDITION_AJOUTER_DISQUE:
  216.                             vAddDisk(Cursor1, (fXmax - fXmin) / 4., iH);
  217.                             break;
  218.  
  219.                         case ID_EDITION_AJOUTER_CERCLE:
  220.                             vAddCircle(Cursor1, (fXmax - fXmin) / 4., iH);
  221.                             break;
  222.  
  223.                         case ID_EDITION_AJOUTER_CYLINDRE:
  224.                             vAddCyl(Cursor1, (fXmax - fXmin) / 4., iH);
  225.                             break;
  226.  
  227.                         case ID_EDITION_AJOUTER_TUBE:
  228.                             vAddTube(Cursor1, (fXmax - fXmin) / 4., iH);
  229.                             break;
  230.  
  231.                         case ID_EDITION_AJOUTER_CNE:
  232.                             vAddCone(Cursor1, (fXmax - fXmin) / 4., iH);
  233.                             break;
  234.  
  235.                         case ID_EDITION_GRIDSTEP:
  236.                             fGridSize = iH / 100.f;
  237.                             break;
  238.                     }
  239.  
  240.                     // Redessiner la 2D
  241.                     vForce2DRefresh(XDC_MODE_COMPLET);
  242.                     // Redessiner la 3D
  243.                     if (lParam != ID_EDITION_AJOUTER_CERCLE && lParam != ID_EDITION_GRIDSTEP) vForce3DRefresh(XDC_MODE_COMPLET);
  244.  
  245.                      EndDialog(hWnd, 0);
  246.                 }
  247.                  else
  248.                  {
  249.                      vTrace("*** E0008 : définition impossible (SH : %d, sV : %d)", iH, iV);
  250.                      EndDialog(hWnd, -1);
  251.                  }
  252.                  break;
  253.         }
  254.         return TRUE;
  255.         break;
  256.  
  257.     case WM_INITDIALOG :
  258.         iDlgId = lParam;
  259.  
  260.         sprintf(cBuf, "%d", iDlgId == ID_EDITION_GRIDSTEP ? (int) (100. * fGridSize) : iH);  SendDlgItemMessage(hWnd, IDC_SH, WM_SETTEXT, 0, (LPARAM) cBuf);
  261.     
  262.         b2Params = (ID_EDITION_AJOUTER_SPHRE
  263.                  || iDlgId == ID_EDITION_AJOUTER_HMISPHRE
  264.                  || iDlgId == ID_EDITION_AJOUTER_TORE);
  265.         if (b2Params) { sprintf(cBuf, "%d", iV);  SendDlgItemMessage(hWnd, IDC_SV, WM_SETTEXT, 0, (LPARAM) cBuf); }
  266.  
  267.         return TRUE;
  268.     }
  269.  
  270.     return FALSE;
  271. }
  272.  
  273. extern BOOL GetScrollInfo(int iGad, int iDummy, SCROLLINFO *hSi, BOOL bDummy);
  274.  
  275. ////////////////////// M A T E R I A L S ////////////////////////////////////
  276. BOOL CALLBACK bMtrlDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  277. {
  278.     static int iMtrl;
  279.     int iCnt;
  280.     static gMtrl gMtrlBak;
  281.     char cVal[255];
  282.     float fValue;
  283.     D3DMATERIAL7 *pMtrl;
  284.     char cBuf[80];
  285.  
  286.     Si.cbSize = sizeof(Si);
  287.  
  288.     switch( uMsg )
  289.     {
  290.         case WM_COMMAND :
  291.              switch (LOWORD(wParam))
  292.              {
  293.                 // Bouton texturé
  294.                 case IDC_MTEXTURED:
  295.                     if (Materials[iMtrl].bTextured = SendDlgItemMessage(hWnd, IDC_MTEXTURED, BM_GETCHECK, (WPARAM) 0, 0L))
  296.                     {
  297.                         GetScrollInfo(IDC_TEXNUM, 0, &Si, TRUE);
  298.                         strncpy(Materials[iMtrl].sTexName, Textures[Si.nPos].sName, sizeof(Materials[iMtrl].sTexName));
  299.                         vXRefMaterials2Textures();
  300.                     }
  301.                     
  302.                     // Redessiner la 3D
  303.                     vForce3DRefresh(XDC_MODE_COMPLET);
  304.  
  305.                     goto __Mtrl_SetSliders;
  306.  
  307.                 case IDS_NOM:
  308.                     SendDlgItemMessage(hWnd, IDS_NOM, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf);
  309.                     strncpy(Materials[iMtrl].sName, cBuf, sizeof(Materials[iMtrl].sName));
  310.                     break;
  311.  
  312.                 case IDC_NEW:
  313.                     iCnt = iMakeMaterial(&(Materials[iMtrl].mtrl), Materials[iMtrl].sName, XDC_FORCENEW);
  314.                     if (iCnt != -1)
  315.                     {
  316.                         if (strlen(Materials[iCnt].sName) < sizeof(Materials[iCnt].sName) - 9) strcat(Materials[iCnt].sName, "[copie]");
  317.                         Materials[iCnt].bTextured = Materials[iMtrl].bTextured;
  318.                         strncpy(Materials[iCnt].sTexName, Materials[iMtrl].sTexName, sizeof(Materials[iCnt].sTexName));
  319.  
  320.                         vXRefMaterials2Textures();
  321.  
  322.                         iMtrl = iCnt;
  323.                         goto __Mtrl_SetAll;
  324.                     }
  325.                     else
  326.                         vTrace("*** E0118 : plus de slot Material libre");
  327.                     break;
  328.  
  329.                 case IDRESET:
  330.                     Materials[iMtrl] = gMtrlBak;
  331.                     vForce3DRefresh(XDC_MODE_COMPLET);
  332.                     goto __Mtrl_SetSliders;
  333.  
  334.                 case IDC_DEL:
  335.                     if (iMtrl < 5) // cf. objects-base, deleteobjects()
  336.                     {
  337.                         vTrace("*** E0119 : suppression d'un des 5 matériaux de base impossible");
  338.                         break;
  339.                     }
  340.  
  341.                     // Vérifier si on a des triangles qui utilisent ce lmaterial avant de le détruire
  342.                     for (iCnt = 0 ; iCnt <= iTriaLastUsed && !(Triangles[iCnt].bEnabled && Triangles[iCnt].iMtrl == iMtrl) ; iCnt++) ;
  343.                     if (iCnt <= iTriaLastUsed)
  344.                     {
  345.                         vTrace("*** E0120 : il y a des facettes attachées à ce material");
  346.                         break;
  347.                     }
  348.  
  349.                     bDeleteMaterial(iMtrl--);
  350.                     vCollect();
  351.                     goto __Mtrl_SetAll;
  352.  
  353.                 case IDCANCEL:
  354.                     Materials[iMtrl] = gMtrlBak;
  355.                     vForce3DRefresh(XDC_MODE_COMPLET);
  356.                 case IDOK:    // Fin dialogue
  357.                     EndDialog(hWnd, -1);
  358.                     break;
  359.              }
  360.              return TRUE;
  361.              break;
  362.  
  363.          case WM_HSCROLL :    // Scroll slider
  364.             fValue = (float) wParam / 100.f;
  365.             pMtrl = &(Materials[iMtrl].mtrl);
  366.  
  367.             switch(lParam)
  368.             {
  369.                 case IDC_D_A:    pMtrl -> diffuse.a = fValue;  sprintf(cVal, "A %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_D_A, WM_SETTEXT, 0, (long)&cVal[0]); break;
  370.                 case IDC_D_R:    pMtrl -> diffuse.r = fValue;  sprintf(cVal, "R %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_D_R, WM_SETTEXT, 0, (long)&cVal[0]); break;
  371.                 case IDC_D_G:    pMtrl -> diffuse.g = fValue;  sprintf(cVal, "G %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_D_G, WM_SETTEXT, 0, (long)&cVal[0]); break;
  372.                 case IDC_D_B:    pMtrl -> diffuse.b = fValue;  sprintf(cVal, "B %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_D_B, WM_SETTEXT, 0, (long)&cVal[0]); break;
  373.  
  374.                 case IDC_A_A:    pMtrl -> ambient.a = fValue;  sprintf(cVal, "A %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_A_A, WM_SETTEXT, 0, (long)&cVal[0]); break;
  375.                 case IDC_A_R:    pMtrl -> ambient.r = fValue;  sprintf(cVal, "R %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_A_R, WM_SETTEXT, 0, (long)&cVal[0]); break;
  376.                 case IDC_A_G:    pMtrl -> ambient.g = fValue;  sprintf(cVal, "G %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_A_G, WM_SETTEXT, 0, (long)&cVal[0]); break;
  377.                 case IDC_A_B:    pMtrl -> ambient.b = fValue;  sprintf(cVal, "B %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_A_B, WM_SETTEXT, 0, (long)&cVal[0]); break;
  378.  
  379.                 case IDC_S_A:    pMtrl -> specular.a = fValue; sprintf(cVal, "A %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_S_A, WM_SETTEXT, 0, (long)&cVal[0]); break;
  380.                 case IDC_S_R:    pMtrl -> specular.r = fValue; sprintf(cVal, "R %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_S_R, WM_SETTEXT, 0, (long)&cVal[0]); break;
  381.                 case IDC_S_G:    pMtrl -> specular.g = fValue; sprintf(cVal, "G %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_S_G, WM_SETTEXT, 0, (long)&cVal[0]); break;
  382.                 case IDC_S_B:    pMtrl -> specular.b = fValue; sprintf(cVal, "B %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_S_B, WM_SETTEXT, 0, (long)&cVal[0]); break;
  383.                 case IDC_S_P:    pMtrl -> power = fValue;      sprintf(cVal, "P %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_S_P, WM_SETTEXT, 0, (long)&cVal[0]); break;
  384.  
  385.                 case IDC_E_A:    pMtrl -> emissive.a = fValue; sprintf(cVal, "A %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_E_A, WM_SETTEXT, 0, (long)&cVal[0]); break;
  386.                 case IDC_E_R:    pMtrl -> emissive.r = fValue; sprintf(cVal, "R %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_E_R, WM_SETTEXT, 0, (long)&cVal[0]); break;
  387.                 case IDC_E_G:    pMtrl -> emissive.g = fValue; sprintf(cVal, "G %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_E_G, WM_SETTEXT, 0, (long)&cVal[0]); break;
  388.                 case IDC_E_B:    pMtrl -> emissive.b = fValue; sprintf(cVal, "B %03d %%", wParam); SendDlgItemMessage(hWnd, IDV_E_B, WM_SETTEXT, 0, (long)&cVal[0]); break;
  389.  
  390.                 case IDC_MATNUM : iMtrl = wParam; goto __Mtrl_SetAll;
  391.                 case IDC_TEXNUM :
  392.                     strncpy(Materials[iMtrl].sTexName, Textures[wParam].sName, sizeof(Materials[iMtrl].sTexName));
  393.                     vXRefMaterials2Textures();
  394.                     vForce3DRefresh(XDC_MODE_COMPLET);
  395.                     goto __Mtrl_SetSliders;
  396.               }
  397.  
  398.             // Redessiner la 3D
  399.             vForce3DRefresh(XDC_MODE_COMPLET);
  400.             return TRUE;
  401.  
  402.         case WM_INITDIALOG :
  403. __Mtrl_SetAll:
  404.             gMtrlBak = Materials[iMtrl];
  405.             // Positionner le slider n° matériau
  406.             Si.fMask = SIF_POS | SIF_RANGE;
  407.             Si.nMin = 0;              // Mini
  408.             Si.nMax = iMtrlLastUsed;  // Maxi
  409.             Si.nPos = iMtrl;
  410.             SetScrollInfo(GetDlgItem(hWnd, IDC_MATNUM), SB_CTL, &Si, TRUE);
  411.  
  412. __Mtrl_SetSliders:
  413.             sprintf(cVal, "%04d", iMtrl); SendDlgItemMessage(hWnd, IDV_MATNUM, WM_SETTEXT, 0, (LPARAM)&cVal[0]);
  414.             SendDlgItemMessage(hWnd, IDC_MTEXTURED, BM_SETCHECK, (WPARAM) Materials[iMtrl].bTextured, 0L);
  415.             SendDlgItemMessage(hWnd, IDS_NOM, WM_SETTEXT, 0, (LPARAM) &Materials[iMtrl].sName[0]);
  416.             SendDlgItemMessage(hWnd, IDV_TEXNAME, WM_SETTEXT, 0, (LPARAM) (Materials[iMtrl].bTextured ? &Textures[Materials[iMtrl].iTexture].sName[0] : "--------.---"));
  417.  
  418.             // Positionner les sliders couleurs
  419.             Si.fMask = SIF_POS | SIF_RANGE;
  420.             Si.nMin = 0;    // Mini
  421.             Si.nMax = iTextLastUsed;
  422.             Si.nPos = Materials[iMtrl].iTexture;
  423.             SetScrollInfo(GetDlgItem(hWnd, IDC_TEXNUM), SB_CTL, &Si, TRUE);
  424.             SendDlgItemMessage(hWnd, IDC_TEXNUM, GA_Disabled, Materials[iMtrl].bTextured, 0);
  425.             SendDlgItemMessage(hWnd, IDV_TEXNAME, GA_Disabled, Materials[iMtrl].bTextured, 0);
  426.  
  427.             Si.nMax = 100;    // Maxi
  428.             pMtrl = &(Materials[iMtrl].mtrl);
  429.  
  430.             Si.nPos = (int) (100.f * pMtrl -> diffuse.a);  sprintf(cVal, "A %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_D_A), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_D_A, WM_SETTEXT, 0, (long)&cVal[0]);
  431.             Si.nPos = (int) (100.f * pMtrl -> diffuse.r);  sprintf(cVal, "R %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_D_R), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_D_R, WM_SETTEXT, 0, (long)&cVal[0]);
  432.             Si.nPos = (int) (100.f * pMtrl -> diffuse.g);  sprintf(cVal, "G %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_D_G), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_D_G, WM_SETTEXT, 0, (long)&cVal[0]);
  433.             Si.nPos = (int) (100.f * pMtrl -> diffuse.b);  sprintf(cVal, "B %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_D_B), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_D_B, WM_SETTEXT, 0, (long)&cVal[0]);
  434.  
  435.             Si.nPos = (int) (100.f * pMtrl -> ambient.a);  sprintf(cVal, "A %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_A_A), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_A_A, WM_SETTEXT, 0, (long)&cVal[0]);
  436.             Si.nPos = (int) (100.f * pMtrl -> ambient.r);  sprintf(cVal, "R %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_A_R), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_A_R, WM_SETTEXT, 0, (long)&cVal[0]);
  437.             Si.nPos = (int) (100.f * pMtrl -> ambient.g);  sprintf(cVal, "G %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_A_G), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_A_G, WM_SETTEXT, 0, (long)&cVal[0]);
  438.             Si.nPos = (int) (100.f * pMtrl -> ambient.b);  sprintf(cVal, "B %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_A_B), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_A_B, WM_SETTEXT, 0, (long)&cVal[0]);
  439.  
  440.             Si.nPos = (int) (100.f * pMtrl -> specular.a); sprintf(cVal, "A %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_S_A), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_S_A, WM_SETTEXT, 0, (long)&cVal[0]);
  441.             Si.nPos = (int) (100.f * pMtrl -> specular.r); sprintf(cVal, "R %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_S_R), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_S_R, WM_SETTEXT, 0, (long)&cVal[0]);
  442.             Si.nPos = (int) (100.f * pMtrl -> specular.g); sprintf(cVal, "G %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_S_G), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_S_G, WM_SETTEXT, 0, (long)&cVal[0]);
  443.             Si.nPos = (int) (100.f * pMtrl -> specular.b); sprintf(cVal, "B %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_S_B), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_S_B, WM_SETTEXT, 0, (long)&cVal[0]);
  444.             Si.nPos = (int) (100.f * pMtrl -> power);      sprintf(cVal, "P %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_S_P), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_S_P, WM_SETTEXT, 0, (long)&cVal[0]);
  445.  
  446.             Si.nPos = (int) (100.f * pMtrl -> emissive.a); sprintf(cVal, "A %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_E_A), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_E_A, WM_SETTEXT, 0, (long)&cVal[0]);
  447.             Si.nPos = (int) (100.f * pMtrl -> emissive.r); sprintf(cVal, "R %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_E_R), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_E_R, WM_SETTEXT, 0, (long)&cVal[0]);
  448.             Si.nPos = (int) (100.f * pMtrl -> emissive.g); sprintf(cVal, "G %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_E_G), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_E_G, WM_SETTEXT, 0, (long)&cVal[0]);
  449.             Si.nPos = (int) (100.f * pMtrl -> emissive.b); sprintf(cVal, "B %03d %%", Si.nPos); SetScrollInfo(GetDlgItem(hWnd, IDC_E_B), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDV_E_B, WM_SETTEXT, 0, (long)&cVal[0]);
  450.  
  451.             return TRUE;
  452.     }
  453.     return FALSE;
  454. }
  455.  
  456. ////////////////////// L A M P E S ////////////////////////////////////
  457. BOOL CALLBACK bLampDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  458. {
  459.     static int iLamp;
  460.     static gLamp gLampBak;
  461.     static D3DLIGHT7 *pLamp;
  462.     char cBuf[80];
  463.  
  464.     Si.cbSize = sizeof(Si);
  465.  
  466.     switch( uMsg )
  467.     {
  468.         case WM_COMMAND :
  469.              switch (LOWORD(wParam))
  470.              {
  471.                 case IDC_LIT:
  472.                     Lampes[iLamp].bLit = SendDlgItemMessage(hWnd, IDC_LIT, BM_GETCHECK,   (WPARAM) 0, 0L);;
  473.                     goto __Lamp_Done;
  474.  
  475.                 case IDC_POINT:
  476.                     pLamp -> dltType = D3DLIGHT_POINT;
  477.                     goto __Lamp_Done;
  478.  
  479.                 case IDC_DIRECT:
  480.                     pLamp -> dltType = D3DLIGHT_DIRECTIONAL;
  481.                     goto __Lamp_Done;
  482.  
  483.                 case IDC_SPOT:
  484.                     pLamp -> dltType = D3DLIGHT_SPOT;
  485.                     goto __Lamp_Done;
  486.  
  487.                 case IDV_D_A:
  488.                     SendDlgItemMessage(hWnd, IDV_D_A, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvDiffuse.a = atof(cBuf)/255.;
  489.                     goto __Lamp_Done;
  490.  
  491.                 case IDV_D_R:
  492.                     SendDlgItemMessage(hWnd, IDV_D_R, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvDiffuse.r = atof(cBuf)/255.;
  493.                     goto __Lamp_Done;
  494.  
  495.                 case IDV_D_V:
  496.                     SendDlgItemMessage(hWnd, IDV_D_V, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvDiffuse.g = atof(cBuf)/255.;
  497.                     goto __Lamp_Done;
  498.  
  499.                 case IDV_D_B:
  500.                     SendDlgItemMessage(hWnd, IDV_D_B, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvDiffuse.b = atof(cBuf)/255.;
  501.                     goto __Lamp_Done;
  502.  
  503.                 case IDC_A_A:
  504.                     SendDlgItemMessage(hWnd, IDV_A_A, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvAmbient.a = atof(cBuf)/255.;
  505.                     goto __Lamp_Done;
  506.  
  507.                 case IDV_A_R:
  508.                     SendDlgItemMessage(hWnd, IDV_A_R, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvAmbient.r = atof(cBuf)/255.;
  509.                     goto __Lamp_Done;
  510.  
  511.                 case IDV_A_V:
  512.                     SendDlgItemMessage(hWnd, IDV_A_V, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvAmbient.g = atof(cBuf)/255.;
  513.                     goto __Lamp_Done;
  514.  
  515.                 case IDV_A_B:
  516.                     SendDlgItemMessage(hWnd, IDV_A_B, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvAmbient.b = atof(cBuf)/255.;
  517.                     goto __Lamp_Done;
  518.  
  519.                 case IDC_S_A:
  520.                     SendDlgItemMessage(hWnd, IDV_S_A, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvSpecular.a = atof(cBuf)/255.;
  521.                     goto __Lamp_Done;
  522.  
  523.                 case IDV_S_R:
  524.                     SendDlgItemMessage(hWnd, IDV_S_R, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvSpecular.r = atof(cBuf)/255.;
  525.                     goto __Lamp_Done;
  526.  
  527.                 case IDV_S_V:
  528.                     SendDlgItemMessage(hWnd, IDV_S_V, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvSpecular.g = atof(cBuf)/255.;
  529.                     goto __Lamp_Done;
  530.  
  531.                 case IDV_S_B:
  532.                     SendDlgItemMessage(hWnd, IDV_S_B, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dcvSpecular.b = atof(cBuf)/255.;
  533.                     goto __Lamp_Done;
  534.  
  535.                 case IDV_RNG:
  536.                     SendDlgItemMessage(hWnd, IDV_RNG, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dvRange = atof(cBuf);
  537.                     goto __Lamp_Done;
  538.  
  539.                 case IDV_FAL:
  540.                     SendDlgItemMessage(hWnd, IDV_FAL, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dvFalloff = atof(cBuf);
  541.                     goto __Lamp_Done;
  542.  
  543.                 case IDV_TET:
  544.                     SendDlgItemMessage(hWnd, IDV_TET, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dvTheta = atof(cBuf);
  545.                     goto __Lamp_Done;
  546.  
  547.                 case IDV_PHI:
  548.                     SendDlgItemMessage(hWnd, IDV_PHI, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dvPhi = atof(cBuf);
  549.                     goto __Lamp_Done;
  550.  
  551.                 case IDV_ATTN0:
  552.                     SendDlgItemMessage(hWnd, IDV_ATTN0, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dvAttenuation0 = atof(cBuf);
  553.                     goto __Lamp_Done;
  554.  
  555.                 case IDV_ATTN1:
  556.                     SendDlgItemMessage(hWnd, IDV_ATTN1, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dvAttenuation1 = atof(cBuf);
  557.                     goto __Lamp_Done;
  558.  
  559.                 case IDV_ATTN2:
  560.                     SendDlgItemMessage(hWnd, IDV_ATTN2, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); pLamp -> dvAttenuation2 = atof(cBuf);
  561.                     goto __Lamp_Done;
  562.  
  563.                 case IDRESET:
  564.                     Lampes[iLamp] = gLampBak;
  565. __Lamp_Done:
  566.                     vForce3DRefresh(XDC_MODE_COMPLET);
  567.                     goto __Lamp_SetSliders;
  568.  
  569.                 case IDCANCEL:
  570.                     Lampes[iLamp] = gLampBak;
  571.                     vForce3DRefresh(XDC_MODE_COMPLET);
  572.                 case IDOK:    // Fin dialogue
  573.                     iLampHilit = -1;
  574.                     vForce2DRefresh(XDC_MODE_COMPLET);
  575.                       EndDialog(hWnd, -1);
  576.                     break;
  577.              }
  578.              return TRUE;
  579.              break;
  580.  
  581.          case WM_HSCROLL :    // Scroll slider
  582.             pLamp = &(Lampes[iLamp].lLamp);
  583.  
  584.             switch(lParam)
  585.             {
  586.                 case IDC_LAMPNUM :
  587.                     iLampHilit = iLamp = wParam;
  588.                     vForce2DRefresh(XDC_MODE_COMPLET);
  589.                     goto __Lamp_SetAll;
  590.             }
  591.  
  592.             // Redessiner la 3D
  593.             vForce3DRefresh(XDC_MODE_COMPLET);
  594.             return TRUE;
  595.  
  596.         case WM_INITDIALOG :
  597.             vCollect();
  598.  
  599.             iLampHilit = iLamp = 0;
  600.             vForce2DRefresh(XDC_MODE_COMPLET);
  601.  
  602. __Lamp_SetAll:
  603.             gLampBak = Lampes[iLamp];
  604.             // Positionner le slider n° lampe
  605.             Si.fMask = SIF_POS | SIF_RANGE;
  606.             Si.nMin = 0;              // Mini
  607.             Si.nMax = iLampLastUsed;  // Maxi
  608.             Si.nPos = iLamp;
  609.             SetScrollInfo(GetDlgItem(hWnd, IDC_LAMPNUM), SB_CTL, &Si, TRUE);
  610.  
  611. __Lamp_SetSliders:
  612.             sprintf(cBuf, "%04d", iLamp); SendDlgItemMessage(hWnd, IDV_LAMPNUM, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  613.  
  614.             pLamp = &(Lampes[iLamp].lLamp);
  615.             sprintf(cBuf, "%d", (int) (pLamp -> dcvDiffuse.a * 255));  SendDlgItemMessage(hWnd, IDV_D_A, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  616.             sprintf(cBuf, "%d", (int) (pLamp -> dcvDiffuse.r * 255));  SendDlgItemMessage(hWnd, IDV_D_R, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  617.             sprintf(cBuf, "%d", (int) (pLamp -> dcvDiffuse.g * 255));  SendDlgItemMessage(hWnd, IDV_D_V, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  618.             sprintf(cBuf, "%d", (int) (pLamp -> dcvDiffuse.b * 255));  SendDlgItemMessage(hWnd, IDV_D_B, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  619.  
  620.             sprintf(cBuf, "%d", (int) (pLamp -> dcvAmbient.a * 255));  SendDlgItemMessage(hWnd, IDV_A_A, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  621.             sprintf(cBuf, "%d", (int) (pLamp -> dcvAmbient.r * 255));  SendDlgItemMessage(hWnd, IDV_A_R, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  622.             sprintf(cBuf, "%d", (int) (pLamp -> dcvAmbient.g * 255));  SendDlgItemMessage(hWnd, IDV_A_V, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  623.             sprintf(cBuf, "%d", (int) (pLamp -> dcvAmbient.b * 255));  SendDlgItemMessage(hWnd, IDV_A_B, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  624.  
  625.             sprintf(cBuf, "%d", (int) (pLamp -> dcvSpecular.a * 255)); SendDlgItemMessage(hWnd, IDV_S_A, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  626.             sprintf(cBuf, "%d", (int) (pLamp -> dcvSpecular.r * 255)); SendDlgItemMessage(hWnd, IDV_S_R, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  627.             sprintf(cBuf, "%d", (int) (pLamp -> dcvSpecular.g * 255)); SendDlgItemMessage(hWnd, IDV_S_V, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  628.             sprintf(cBuf, "%d", (int) (pLamp -> dcvSpecular.b * 255)); SendDlgItemMessage(hWnd, IDV_S_B, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  629.  
  630.             sprintf(cBuf, "%-1.f", pLamp -> dvRange);                   SendDlgItemMessage(hWnd, IDV_RNG, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  631.             sprintf(cBuf, "%-1.f", pLamp -> dvFalloff);                 SendDlgItemMessage(hWnd, IDV_FAL, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  632.             sprintf(cBuf, "%-1.f", pLamp -> dvTheta);                   SendDlgItemMessage(hWnd, IDV_TET, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  633.             sprintf(cBuf, "%-1.f", pLamp -> dvPhi);                     SendDlgItemMessage(hWnd, IDV_PHI, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  634.  
  635.             sprintf(cBuf, "%-1.f", pLamp -> dvAttenuation0);            SendDlgItemMessage(hWnd, IDV_ATTN0, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  636.             sprintf(cBuf, "%-1.f", pLamp -> dvAttenuation1);            SendDlgItemMessage(hWnd, IDV_ATTN1, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  637.             sprintf(cBuf, "%-1.f", pLamp -> dvAttenuation2);            SendDlgItemMessage(hWnd, IDV_ATTN2, WM_SETTEXT, 0, (LPARAM)&cBuf[0]);
  638.  
  639.             SendDlgItemMessage(hWnd, IDC_POINT, BM_SETCHECK,  (WPARAM) (pLamp -> dltType == D3DLIGHT_POINT), 0L);
  640.             SendDlgItemMessage(hWnd, IDC_DIRECT, BM_SETCHECK, (WPARAM) (pLamp -> dltType == D3DLIGHT_DIRECTIONAL), 0L);
  641.             SendDlgItemMessage(hWnd, IDC_SPOT, BM_SETCHECK,   (WPARAM) (pLamp -> dltType == D3DLIGHT_SPOT), 0L);
  642.  
  643.             SendDlgItemMessage(hWnd, IDC_LIT, BM_SETCHECK,   (WPARAM) Lampes[iLamp].bLit, 0L);
  644.             return TRUE;
  645.     }
  646.     return FALSE;
  647. }
  648.  
  649. ////////////////////// F A C E S ////////////////////////////////////////////
  650. BOOL CALLBACK bFaceDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  651. {
  652.     static int iMtrl, iTriangle, iTexture, iNext, iDef;
  653.     char cVal[255];
  654.     float fValue;
  655.     D3DMATERIAL7 *pMtrl;
  656.  
  657.     Si.cbSize = sizeof(Si);
  658.  
  659.     // Remettre à jour les n° matériau et texture
  660.     iMtrl = Triangles[iTriangle].iMtrl;
  661.     iTexture = Materials[iMtrl].iTexture;
  662.  
  663.     switch( uMsg )
  664.     {
  665.         case WM_COMMAND :
  666.              switch (LOWORD(wParam))
  667.              {
  668.                 case IDC_REPLICATE:    // Dupliquer le réglage matériau sur toutes les facettes
  669.                 case IDC_REPLICATE_UV: // Dupliquer le réglage matériau ET UV sur toutes les facettes
  670.                     for (iNext = 0 ; iNext <= iTriaLastUsed ; iNext++)
  671.                         if (Triangles[iNext].bEnabled && bIsTriangleSelected(iNext) && iNext != iTriangle)
  672.                         {
  673.                             Triangles[iNext].iMtrl = iMtrl;
  674.                             if (LOWORD(wParam) == IDC_REPLICATE_UV)
  675.                             {
  676.                                 Triangles[iNext].u[0] = Triangles[iTriangle].u[0];
  677.                                 Triangles[iNext].u[1] = Triangles[iTriangle].u[1];
  678.                                 Triangles[iNext].u[2] = Triangles[iTriangle].u[2];
  679.                                 Triangles[iNext].v[0] = Triangles[iTriangle].v[0];
  680.                                 Triangles[iNext].v[1] = Triangles[iTriangle].v[1];
  681.                                 Triangles[iNext].v[2] = Triangles[iTriangle].v[2];
  682.                             }
  683.                         }
  684.  
  685.                     vForce3DRefresh(XDC_MODE_COMPLET);
  686.                     break;
  687.  
  688.                 case IDC_PREV:  // Facette précédente
  689. __Face_Prev:
  690.                     for (iNext = iTriangle - 1 ; iNext >= 0 && !(Triangles[iNext].bEnabled && bIsTriangleSelected(iNext)); iNext--) ;
  691.                     if (!(Triangles[iNext].bEnabled && bIsTriangleSelected(iNext))) { iTriangle = iTriaLastUsed + 1 ; goto __Face_Prev; }
  692.                     goto __Face_Found;
  693.  
  694.                 case IDC_NEXT:  // Facette suivante
  695. __Face_Next:
  696.                     for (iNext = iTriangle + 1 ; iNext <= iTriaLastUsed && !(Triangles[iNext].bEnabled && bIsTriangleSelected(iNext)); iNext++) ;
  697.                     if (!(Triangles[iNext].bEnabled && bIsTriangleSelected(iNext))) { iTriangle = -1 ; goto __Face_Next; }
  698.  
  699. __Face_Found:
  700.                     // Mémoriser le n° de cette facette
  701.                     iTriangle = iNext;
  702.  
  703.                     // Rafraîchir la vue 3D en highlightant la facette
  704.                     iTriaHilit = iTriangle;
  705.                     vForce3DRefresh(XDC_MODE_COMPLET);
  706.                     iTriaHilit = -1;
  707.  
  708.                     // Mettre à jour tous les gadgets
  709.                     goto __Face_ResetAll;
  710.  
  711.                 case IDCANCEL:
  712.                 case IDOK:    // Fin dialogue
  713.                     // Resetter les vues 2D et 3D pour supprimer le highlight de la facette courant
  714.                     vForce2DRefresh(XDC_MODE_COMPLET);
  715.                     vForce3DRefresh(XDC_MODE_COMPLET);
  716.  
  717.                     // Fin dialogue
  718.                     EndDialog(hWnd, -1);
  719.                     break;
  720.  
  721.                 case IDC_NE:                // Affecter U/V sur le triangle NE suivant
  722.                     Triangles[iTriangle].u[0] = iNE[iDef][0][0] * (Textures[iTexture].iWidth - 1);
  723.                     Triangles[iTriangle].u[1] = iNE[iDef][1][0] * (Textures[iTexture].iWidth - 1);
  724.                     Triangles[iTriangle].u[2] = iNE[iDef][2][0] * (Textures[iTexture].iWidth - 1);
  725.                     Triangles[iTriangle].v[0] = iNE[iDef][0][1] * (Textures[iTexture].iHeight - 1);
  726.                     Triangles[iTriangle].v[1] = iNE[iDef][1][1] * (Textures[iTexture].iHeight - 1);
  727.                     Triangles[iTriangle].v[2] = iNE[iDef][2][1] * (Textures[iTexture].iHeight - 1);
  728.                     goto __Face_NSEW;
  729.                 case IDC_SE:                // Affecter U/V sur le triangle SE suivant
  730.                     Triangles[iTriangle].u[0] = iSE[iDef][0][0] * (Textures[iTexture].iWidth - 1);
  731.                     Triangles[iTriangle].u[1] = iSE[iDef][1][0] * (Textures[iTexture].iWidth - 1);
  732.                     Triangles[iTriangle].u[2] = iSE[iDef][2][0] * (Textures[iTexture].iWidth - 1);
  733.                     Triangles[iTriangle].v[0] = iSE[iDef][0][1] * (Textures[iTexture].iHeight - 1);
  734.                     Triangles[iTriangle].v[1] = iSE[iDef][1][1] * (Textures[iTexture].iHeight - 1);
  735.                     Triangles[iTriangle].v[2] = iSE[iDef][2][1] * (Textures[iTexture].iHeight - 1);
  736.                     goto __Face_NSEW;
  737.                 case IDC_NW:                // Affecter U/V sur le triangle NW suivant
  738.                     Triangles[iTriangle].u[0] = iNW[iDef][0][0] * (Textures[iTexture].iWidth - 1);
  739.                     Triangles[iTriangle].u[1] = iNW[iDef][1][0] * (Textures[iTexture].iWidth - 1);
  740.                     Triangles[iTriangle].u[2] = iNW[iDef][2][0] * (Textures[iTexture].iWidth - 1);
  741.                     Triangles[iTriangle].v[0] = iNW[iDef][0][1] * (Textures[iTexture].iHeight - 1);
  742.                     Triangles[iTriangle].v[1] = iNW[iDef][1][1] * (Textures[iTexture].iHeight - 1);
  743.                     Triangles[iTriangle].v[2] = iNW[iDef][2][1] * (Textures[iTexture].iHeight - 1);
  744.                     goto __Face_NSEW;
  745.                 case IDC_SW:                // Affecter U/V sur le triangle SW suivant
  746.                     Triangles[iTriangle].u[0] = iSW[iDef][0][0] * (Textures[iTexture].iWidth - 1);
  747.                     Triangles[iTriangle].u[1] = iSW[iDef][1][0] * (Textures[iTexture].iWidth - 1);
  748.                     Triangles[iTriangle].u[2] = iSW[iDef][2][0] * (Textures[iTexture].iWidth - 1);
  749.                     Triangles[iTriangle].v[0] = iSW[iDef][0][1] * (Textures[iTexture].iHeight - 1);
  750.                     Triangles[iTriangle].v[1] = iSW[iDef][1][1] * (Textures[iTexture].iHeight - 1);
  751.                     Triangles[iTriangle].v[2] = iSW[iDef][2][1] * (Textures[iTexture].iHeight - 1);
  752. __Face_NSEW:
  753.                     // Incrémenter le compteur courant
  754.                     iDef = (++iDef) % 6;
  755.  
  756.                     // Positionner les sliders U
  757.                     Si.nMax = Textures[iTexture].iWidth - 1;
  758.                     Si.nPos = Triangles[iTriangle].u[0]; SetScrollInfo(GetDlgItem(hWnd, IDC_U0), SB_CTL, &Si, TRUE);
  759.                     Si.nPos = Triangles[iTriangle].u[1]; SetScrollInfo(GetDlgItem(hWnd, IDC_U1), SB_CTL, &Si, TRUE);
  760.                     Si.nPos = Triangles[iTriangle].u[2]; SetScrollInfo(GetDlgItem(hWnd, IDC_U2), SB_CTL, &Si, TRUE);
  761.  
  762.                     // Positionner les sliders V
  763.                     Si.nMax = Textures[iTexture].iHeight - 1;
  764.                     Si.nPos = Triangles[iTriangle].v[0]; SetScrollInfo(GetDlgItem(hWnd, IDC_V0), SB_CTL, &Si, TRUE);
  765.                     Si.nPos = Triangles[iTriangle].v[1]; SetScrollInfo(GetDlgItem(hWnd, IDC_V1), SB_CTL, &Si, TRUE);
  766.                     Si.nPos = Triangles[iTriangle].v[2]; SetScrollInfo(GetDlgItem(hWnd, IDC_V2), SB_CTL, &Si, TRUE);
  767.  
  768.                     // Forcer un rafraîchissement de la vue 3D et des sliders U/V
  769.                     goto __Face_SliderDone;
  770.                 }
  771.  
  772.              // Pour EndDialog() des IDOK et IDCANCEL...
  773.              return TRUE;
  774.              break;
  775.  
  776.          case WM_HSCROLL :    // Scroll slider
  777.             fValue = (float) wParam / 100.f;
  778.             pMtrl = &(Materials[iMtrl].mtrl);
  779.  
  780.             switch(lParam)
  781.             {
  782.                 case IDC_MATNUM :   // Slider N° matériau
  783.                     // Mémoriser les nouveaux indices matériau & texture du triangle
  784.                     Triangles[iTriangle].iMtrl = iMtrl = wParam;
  785.                     iTexture = Materials[iMtrl].iTexture;
  786.  
  787.                     // Forcer un rafraîchissement de la vue 3D et des sliders
  788.                     iTriaHilit = iTriangle;
  789.                     vForce3DRefresh(XDC_MODE_COMPLET);
  790.                     iTriaHilit = -1;
  791.                     goto __Face_SetSliders;
  792.  
  793.                 // Sliders U/V : mémoriser u/v dans le triangle, forcer refresh vue 3D et valeurs U/V
  794.                 case IDC_U0: Triangles[iTriangle].u[0] = wParam; goto __Face_SliderDone;
  795.                 case IDC_U1: Triangles[iTriangle].u[1] = wParam; goto __Face_SliderDone;
  796.                 case IDC_U2: Triangles[iTriangle].u[2] = wParam; goto __Face_SliderDone;
  797.                 case IDC_V0: Triangles[iTriangle].v[0] = wParam; goto __Face_SliderDone;
  798.                 case IDC_V1: Triangles[iTriangle].v[1] = wParam; goto __Face_SliderDone;
  799.                 case IDC_V2: Triangles[iTriangle].v[2] = wParam;
  800. __Face_SliderDone:
  801.                     iTriaHilit = iTriangle;
  802.                     vForce3DRefresh(XDC_MODE_COMPLET);
  803.                     iTriaHilit = -1;
  804.                     goto __Face_SetUV;
  805.             }
  806.             return TRUE;
  807.  
  808.         case WM_INITDIALOG :
  809.             // Trouver le premier triangle sélectionné
  810.             for (iTriangle = 0 ; iTriangle <= iTriaLastUsed && !(Triangles[iTriangle].bEnabled && bIsTriangleSelected(iTriangle)); iTriangle++) ;
  811.  
  812.             if (!(Triangles[iTriangle].bEnabled && bIsTriangleSelected(iTriangle)))
  813.             {
  814.                 vTrace("*** E0098 : aucune facette sélectionnée");
  815.                 EndDialog(hWnd, -1);
  816.                 return FALSE;
  817.             }
  818.  
  819.             // Rafraîchir la vue 3D en highlightant la facette
  820.             iTriaHilit = iTriangle;
  821.             vForce3DRefresh(XDC_MODE_COMPLET);
  822.             iTriaHilit = -1;
  823.  
  824. __Face_ResetAll:
  825.             // Mémoriser les indices courants de matériau et texture
  826.             iMtrl = Triangles[iTriangle].iMtrl;
  827.             iTexture = Materials[iMtrl].iTexture;
  828.  
  829.             // Highlighter le triangle courant dans les vues 2D
  830.             iTriaHilit = iTriangle;
  831.             vForce2DRefresh(XDC_MODE_COMPLET);
  832.             iTriaHilit = -1;
  833.  
  834.             // Positionner le slider n° matériau
  835.             Si.fMask = SIF_POS | SIF_RANGE;
  836.             Si.nMin = 0;              // Mini
  837.             Si.nMax = iMtrlLastUsed;  // Maxi
  838.             Si.nPos = iMtrl;
  839.             SetScrollInfo(GetDlgItem(hWnd, IDC_MATNUM), SB_CTL, &Si, TRUE);
  840.  
  841.             // Positionner les sliders U
  842.             Si.nMax = Textures[iTexture].iWidth - 1;
  843.             Si.nPos = Triangles[iTriangle].u[0]; SetScrollInfo(GetDlgItem(hWnd, IDC_U0), SB_CTL, &Si, TRUE);
  844.             Si.nPos = Triangles[iTriangle].u[1]; SetScrollInfo(GetDlgItem(hWnd, IDC_U1), SB_CTL, &Si, TRUE);
  845.             Si.nPos = Triangles[iTriangle].u[2]; SetScrollInfo(GetDlgItem(hWnd, IDC_U2), SB_CTL, &Si, TRUE);
  846.  
  847.             // Positionner les sliders V
  848.             Si.nMax = Textures[iTexture].iHeight - 1;
  849.             Si.nPos = Triangles[iTriangle].v[0]; SetScrollInfo(GetDlgItem(hWnd, IDC_V0), SB_CTL, &Si, TRUE);
  850.             Si.nPos = Triangles[iTriangle].v[1]; SetScrollInfo(GetDlgItem(hWnd, IDC_V1), SB_CTL, &Si, TRUE);
  851.             Si.nPos = Triangles[iTriangle].v[2]; SetScrollInfo(GetDlgItem(hWnd, IDC_V2), SB_CTL, &Si, TRUE);
  852.  
  853. __Face_SetSliders:
  854.             // Indiquer le nom du matériau et de la texture courants
  855.             SendDlgItemMessage(hWnd, IDV_MATNUM, WM_SETTEXT, 0, (LPARAM) &Materials[iMtrl].sName[0]);
  856.             SendDlgItemMessage(hWnd, IDV_TEXNUM, WM_SETTEXT, 0, (LPARAM) (Materials[iMtrl].bTextured ? &Textures[Materials[iMtrl].iTexture].sName[0] : "(non texturé)"));
  857.  
  858. #ifndef __PPC__
  859.             // Si le matériau est texturé, afficher la texture sinon rectfill avec la couleur diffuse du matériau
  860.             if (Materials[iMtrl].bTextured)
  861.                 WritePixelArray(
  862.                                 Textures[iTexture].hTexMap, 0, 0, 4 * Textures[iTexture].iWidth,
  863.                                 hWnd -> RPort,
  864.                                 56, 320 - Textures[iTexture].iHeight, Textures[iTexture].iWidth, Textures[iTexture].iHeight,
  865.                                 RECTFMT_ARGB
  866.                               );
  867.             else
  868.                 FillPixelArray( hWnd -> RPort,
  869.                                 56, 320 - Textures[iTexture].iHeight, Textures[iTexture].iWidth, Textures[iTexture].iHeight,
  870.                                 (((ULONG) (Materials[iMtrl].mtrl.diffuse.a * 255.)) & 0xFF) << 24 |
  871.                                 (((ULONG) (Materials[iMtrl].mtrl.diffuse.r * 255.)) & 0xFF) << 16 |
  872.                                 (((ULONG) (Materials[iMtrl].mtrl.diffuse.g * 255.)) & 0xFF) << 8  |
  873.                                 (((ULONG) (Materials[iMtrl].mtrl.diffuse.b * 255.)) & 0xFF)
  874.                               );
  875. #endif
  876.  
  877. __Face_SetUV:
  878.             // Mettre à jour les valeurs U/V
  879.             sprintf(cVal, "%04d", Triangles[iTriangle].u[0]); SendDlgItemMessage(hWnd, IDV_U0, WM_SETTEXT, 0, (LPARAM)&cVal[0]);
  880.             sprintf(cVal, "%04d", Triangles[iTriangle].u[1]); SendDlgItemMessage(hWnd, IDV_U1, WM_SETTEXT, 0, (LPARAM)&cVal[0]);
  881.             sprintf(cVal, "%04d", Triangles[iTriangle].u[2]); SendDlgItemMessage(hWnd, IDV_U2, WM_SETTEXT, 0, (LPARAM)&cVal[0]);
  882.             sprintf(cVal, "%04d", Triangles[iTriangle].v[0]); SendDlgItemMessage(hWnd, IDV_V0, WM_SETTEXT, 0, (LPARAM)&cVal[0]);
  883.             sprintf(cVal, "%04d", Triangles[iTriangle].v[1]); SendDlgItemMessage(hWnd, IDV_V1, WM_SETTEXT, 0, (LPARAM)&cVal[0]);
  884.             sprintf(cVal, "%04d", Triangles[iTriangle].v[2]); SendDlgItemMessage(hWnd, IDV_V2, WM_SETTEXT, 0, (LPARAM)&cVal[0]);
  885.  
  886.             return TRUE;
  887.     }
  888.     return FALSE;
  889. }
  890.  
  891. ////////////////////// E X P A N S E R  /  R E D U I R E  ////////////////////////////////////////////
  892. BOOL CALLBACK bExpandDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  893. {
  894.     int wmId, nPos, iCnt;
  895.     static D3DVECTOR dVect;
  896.     int iLock = 0;
  897.     char cVal[5];
  898.     static int iExpandLock;
  899.     float fExpandFactor;
  900.  
  901.     Si.cbSize = sizeof(Si);
  902.  
  903.     switch( uMsg )
  904.     {
  905.     case WM_COMMAND :
  906.          wmId    = LOWORD(wParam);
  907.  
  908.          switch (wmId)
  909.          {
  910.             case IDAPPLY:
  911.                 goto __Expand_Init;
  912.  
  913.             case IDCANCEL:    // Quitter
  914.             case IDRESET:
  915.                 for (iCnt = 0 ; iCnt <= iVertLastUsed ; iCnt++)
  916.                     if (bIsVertexSelected(iCnt))
  917.                         Vertices[iCnt].vPoint = Vertices[iCnt].vPointBack;
  918.                 vForce2DRefresh(XDC_MODE_COMPLET);
  919.                 vForce3DRefresh(XDC_MODE_COMPLET);
  920.                 if (wmId == IDRESET) goto __Expand_InitSliders;
  921.  
  922.             case IDOK:    // Appliquer les modifs
  923.                 EndDialog(hWnd, 0);
  924.                 break;
  925.  
  926.             case IDC_LOCK:
  927.                 iExpandLock = SendDlgItemMessage(hWnd, IDC_LOCK, BM_GETCHECK, (WPARAM) 0, 0L);
  928.                 break;
  929.          }
  930.          return TRUE;
  931.  
  932.      case WM_HSCROLL :    // Scroll slider
  933.          // Récupérer les valeurs de scroll
  934.          nPos = wParam;   // scroll value
  935.  
  936.          sprintf(cVal, "%d%%", nPos);
  937.          fExpandFactor = (float) nPos / 100.f;
  938.          Si.fMask = SIF_POS;
  939.          Si.nPos = nPos;
  940.  
  941.          if (iExpandLock)
  942.          {
  943.             for (iCnt = 0 ; iCnt <= iVertLastUsed ; iCnt++)
  944.                 if (bIsVertexSelected(iCnt))
  945.                 {
  946.                     Vertices[iCnt].vPoint.x = dVect.x + (Vertices[iCnt].vPointBack.x - dVect.x) * fExpandFactor;
  947.                     Vertices[iCnt].vPoint.y = dVect.y + (Vertices[iCnt].vPointBack.y - dVect.y) * fExpandFactor;
  948.                     Vertices[iCnt].vPoint.z = dVect.z + (Vertices[iCnt].vPointBack.z - dVect.z) * fExpandFactor;
  949.                 }
  950.  
  951.             SendDlgItemMessage(hWnd, IDC_EXV, WM_SETTEXT, 0, (long)&cVal[0]);
  952.             SendDlgItemMessage(hWnd, IDC_EYV, WM_SETTEXT, 0, (long)&cVal[0]);
  953.             SendDlgItemMessage(hWnd, IDC_EZV, WM_SETTEXT, 0, (long)&cVal[0]);
  954.  
  955.             switch(GetDlgCtrlID(lParam))
  956.             {
  957.                 case IDC_EX :
  958.                     SetScrollInfo(GetDlgItem(hWnd, IDC_EY), SB_CTL, &Si, TRUE);
  959.                     SetScrollInfo(GetDlgItem(hWnd, IDC_EZ), SB_CTL, &Si, TRUE);
  960.                     break;
  961.  
  962.                 case IDC_EY :
  963.                     SetScrollInfo(GetDlgItem(hWnd, IDC_EX), SB_CTL, &Si, TRUE);
  964.                     SetScrollInfo(GetDlgItem(hWnd, IDC_EZ), SB_CTL, &Si, TRUE);
  965.                     break;
  966.                
  967.                 case IDC_EZ :
  968.                     SetScrollInfo(GetDlgItem(hWnd, IDC_EX), SB_CTL, &Si, TRUE);
  969.                     SetScrollInfo(GetDlgItem(hWnd, IDC_EY), SB_CTL, &Si, TRUE);
  970.                     break;
  971.             }
  972.          }
  973.          else
  974.          {
  975.              switch(GetDlgCtrlID(lParam))
  976.              {
  977.                  case IDC_EX :
  978.                     SendDlgItemMessage(hWnd, IDC_EXV, WM_SETTEXT, 0, (long)&cVal[0]);
  979.                     for (iCnt = 0 ; iCnt <= iVertLastUsed ; iCnt++)
  980.                         if (bIsVertexSelected(iCnt))
  981.                             Vertices[iCnt].vPoint.x = dVect.x + (Vertices[iCnt].vPointBack.x - dVect.x) * fExpandFactor;
  982.                      break;
  983.                  case IDC_EY :
  984.                     SendDlgItemMessage(hWnd, IDC_EYV, WM_SETTEXT, 0, (long)&cVal[0]);
  985.                     for (iCnt = 0 ; iCnt <= iVertLastUsed ; iCnt++)
  986.                         if (bIsVertexSelected(iCnt))
  987.                             Vertices[iCnt].vPoint.y = dVect.y + (Vertices[iCnt].vPointBack.y - dVect.y) * fExpandFactor;
  988.                      break;
  989.                  case IDC_EZ :
  990.                     SendDlgItemMessage(hWnd, IDC_EZV, WM_SETTEXT, 0, (long)&cVal[0]);
  991.                     for (iCnt = 0 ; iCnt <= iVertLastUsed ; iCnt++)
  992.                         if (bIsVertexSelected(iCnt))
  993.                             Vertices[iCnt].vPoint.z = dVect.z + (Vertices[iCnt].vPointBack.z - dVect.z) * fExpandFactor;
  994.                      break;
  995.              }
  996.          }
  997.  
  998.           // Redessiner 2D & 3D
  999.           vForce2DRefresh(XDC_MODE_COMPLET);
  1000.           vForce3DRefresh(XDC_MODE_COMPLET);
  1001.          return TRUE;
  1002.  
  1003.     case WM_INITDIALOG :
  1004.         SendDlgItemMessage(hWnd, IDC_LOCK, BM_SETCHECK, (WPARAM) iExpandLock, 0L);
  1005.  
  1006. __Expand_Init:
  1007.         // Déterminer le barycentre de la sélection (on travaille par rapport à lui)
  1008.         dVect = vCenter();
  1009.  
  1010. __Expand_InitSliders:
  1011.         // Positionner les sliders
  1012.         Si.fMask = SIF_POS | SIF_RANGE;
  1013.         Si.nMin = 0;    // Mini
  1014.         Si.nMax = 200;    // Maxi
  1015.         Si.nPos = 100;    // Position initiale
  1016.         sprintf(cVal, "%d%%", Si.nPos);
  1017.  
  1018.         SetScrollInfo(GetDlgItem(hWnd, IDC_EX), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDC_EXV, WM_SETTEXT, 0, (long)&cVal[0]);
  1019.         SetScrollInfo(GetDlgItem(hWnd, IDC_EY), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDC_EYV, WM_SETTEXT, 0, (long)&cVal[0]);
  1020.         SetScrollInfo(GetDlgItem(hWnd, IDC_EZ), SB_CTL, &Si, TRUE); SendDlgItemMessage(hWnd, IDC_EZV, WM_SETTEXT, 0, (long)&cVal[0]);
  1021.  
  1022.         return TRUE;
  1023.     }
  1024.     return FALSE;
  1025. }
  1026.  
  1027. ////////////////////// H E L I C E ////////////////////////////////////////////
  1028. BOOL CALLBACK bHelixDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1029. {
  1030.     int wmId;
  1031.     static int iRot, iTrans, iDP = 18, iAP = 6, iP = 20;      // Degrés par pas, avance par pas, nombre de pas
  1032.     static BOOL bLierClones = TRUE;
  1033.     char cBuf[12];
  1034.     D3DVECTOR vShift = D3DVECTOR(0.f, 0.f, 0.f);;
  1035.     D3DMATRIX mRot;
  1036.     float fAngle;
  1037.  
  1038.     switch( uMsg )
  1039.     {
  1040.     case WM_COMMAND :
  1041.          wmId    = LOWORD(wParam);
  1042.  
  1043.          switch (wmId)
  1044.          {
  1045.             // Bouton lier clones
  1046.             case IDC_LCL:
  1047.                 bLierClones = SendDlgItemMessage(hWnd, IDC_LCL, BM_GETCHECK, (WPARAM) 0, 0L);
  1048.                 break;
  1049.  
  1050.             // Boutons sélection rotation autour axe X/Y/Z... (kwikandirti)
  1051.             case IDC_RX:
  1052.             case IDC_RY:
  1053.             case IDC_RZ:
  1054.                 iRot = wmId;
  1055. #ifdef _AMIGA_  // Gérer l'exclusion mutuelle a la mano
  1056.                 SendDlgItemMessage(hWnd, IDC_RX, BM_SETCHECK, (WPARAM) (iRot == IDC_RX), 0L);
  1057.                 SendDlgItemMessage(hWnd, IDC_RY, BM_SETCHECK, (WPARAM) (iRot == IDC_RY), 0L);
  1058.                 SendDlgItemMessage(hWnd, IDC_RZ, BM_SETCHECK, (WPARAM) (iRot == IDC_RZ), 0L);
  1059. #endif
  1060.                 break;
  1061.  
  1062.             // Boutons sélection translation autour axe X/Y/Z... (kwikandirti)
  1063.             case IDC_TX:
  1064.             case IDC_TY:
  1065.             case IDC_TZ:
  1066.                 iTrans = wmId;
  1067. #ifdef _AMIGA_  // Gérer l'exclusion mutuelle a la mano
  1068.                 SendDlgItemMessage(hWnd, IDC_TX, BM_SETCHECK, (WPARAM) (iTrans == IDC_TX), 0L);
  1069.                 SendDlgItemMessage(hWnd, IDC_TY, BM_SETCHECK, (WPARAM) (iTrans == IDC_TY), 0L);
  1070.                 SendDlgItemMessage(hWnd, IDC_TZ, BM_SETCHECK, (WPARAM) (iTrans == IDC_TZ), 0L);
  1071. #endif
  1072.                 break;
  1073.  
  1074.             // Annuler
  1075.             case IDCANCEL:
  1076.                 EndDialog(hWnd, -1);
  1077.                 break;
  1078.  
  1079.             // Appliquer la transformation
  1080.             case IDOK:
  1081.                 // Récupérer l'angle par pas, l'avance par pas, le nombre de pas
  1082.                 SendDlgItemMessage(hWnd, IDC_DP, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); iDP = atoi(cBuf);
  1083.                 SendDlgItemMessage(hWnd, IDC_AP, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); iAP = atoi(cBuf);
  1084.                 SendDlgItemMessage(hWnd, IDC_P, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); iP = atoi(cBuf);
  1085.  
  1086.                 // Moduler l'angle @360°
  1087.                 iDP = iDP % 360;
  1088.  
  1089.                 // Calculer l'angle en radians
  1090.                 fAngle = g_2_PI * (float) iDP / 360.f;
  1091.  
  1092.                 // Si moins de 1 pas stop
  1093.                 if (iP < 1) EndDialog(hWnd, -1);
  1094.  
  1095.                 // Calculer la matrice de rotation en fonction de l'axe et de l'angle choisis
  1096.                 switch(iRot)
  1097.                 {
  1098.                     case IDC_RY : D3DUtil_SetRotateYMatrix(mRot, -fAngle); break;
  1099.                     case IDC_RZ : D3DUtil_SetRotateZMatrix(mRot, fAngle);  break;
  1100.                     case IDC_RX : D3DUtil_SetRotateXMatrix(mRot, -fAngle); break;
  1101.                 }
  1102.  
  1103.                 // Calculer le vecteur d'avance en fonction de l'axe et de l'avance
  1104.                 switch(iTrans)
  1105.                 {
  1106.                     case IDC_TY : vShift.y += ((float) iAP / 10.f); break;
  1107.                     case IDC_TZ : vShift.z += ((float) iAP / 10.f); break;
  1108.                     case IDC_TX : vShift.x += ((float) iAP / 10.f); break;
  1109.                 }
  1110.  
  1111.                 // Pour chaque pas...
  1112.                 for (int iPas = 0 ; iPas < iP ; iPas ++)
  1113.                 {
  1114.                     // Préparer un clone de la sélection, qui se retrouve sélectionné (en désélectionnant le reste)
  1115.                     bCloneSelection(vShift, bLierClones ? XDC_MODE_EXTRUDE : XDC_MODE_CLONE);
  1116.  
  1117.                     // Appliquer la matrice aux sommets sélectionnés
  1118.                     for (int iVert = 0 ; iVert <= iVertLastUsed ; iVert++)
  1119.                         if (bIsVertexSelected(iVert))
  1120.                         {
  1121.                             // Changer de repère => Cursor1
  1122.                             D3DVECTOR vTrans = Vertices[iVert].vPoint - Cursor1;
  1123.  
  1124.                             // Appliquer la rotation au point translaté
  1125.                             D3DMath_VectorMatrixMultiply(vTrans,
  1126.                                                          vTrans,
  1127.                                                          mRot);
  1128.  
  1129.                             // Remettre dans le repère d'origine
  1130.                             Vertices[iVert].vPoint = vTrans + Cursor1;
  1131.                         }
  1132.                 }
  1133.  
  1134.                 // Redessiner la 2D
  1135.                 vForce2DRefresh(XDC_MODE_COMPLET);
  1136.                 // Redessiner la 3D
  1137.                 vForce3DRefresh(XDC_MODE_COMPLET);
  1138.  
  1139.                 EndDialog(hWnd, 0);
  1140.                 break;
  1141.          }
  1142.          return TRUE;
  1143.  
  1144.      case WM_INITDIALOG :
  1145.         switch(lWActive)
  1146.         {
  1147.             case XDC_WID_TOP : // X et Z
  1148.                 iRot = IDC_RY;
  1149.                 iTrans = IDC_TY;
  1150.                 break;
  1151.  
  1152.             case XDC_WID_FACE : // X et Y
  1153.                 iRot = IDC_RZ;
  1154.                 iTrans = IDC_TZ;
  1155.                 break;
  1156.  
  1157.             case XDC_WID_SIDE : // Z et Y
  1158.                 iRot = IDC_RX;
  1159.                 iTrans = IDC_TX;
  1160.                 break;
  1161.         }
  1162.  
  1163.         SendDlgItemMessage(hWnd, IDC_LCL, BM_SETCHECK, (WPARAM) bLierClones, 0L);
  1164.         SendDlgItemMessage(hWnd, iRot, BM_SETCHECK, (WPARAM) 1, 0L);
  1165.         SendDlgItemMessage(hWnd, iTrans, BM_SETCHECK, (WPARAM) 1, 0L);
  1166.  
  1167.         sprintf(cBuf, "%d", iDP);  SendDlgItemMessage(hWnd, IDC_DP, WM_SETTEXT, 0, (LPARAM) cBuf);
  1168.         sprintf(cBuf, "%d", iAP);  SendDlgItemMessage(hWnd, IDC_AP, WM_SETTEXT, 0, (LPARAM) cBuf);
  1169.         sprintf(cBuf, "%d", iP);   SendDlgItemMessage(hWnd, IDC_P, WM_SETTEXT, 0, (LPARAM) cBuf);
  1170.         return TRUE;
  1171.     }
  1172.     return FALSE;
  1173. }
  1174.  
  1175. ////////////////////// T R O U S   R E M P L I S S A G E  ////////////////////////////////////////////
  1176. BOOL CALLBACK bHoleDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1177. {
  1178.     int wmId;
  1179.     char cBuf[12];
  1180.  
  1181.     switch( uMsg )
  1182.     {
  1183.         case WM_COMMAND :
  1184.              wmId    = LOWORD(wParam);
  1185.  
  1186.              switch (wmId)
  1187.              {
  1188.                 case IDC_FADE:
  1189.                     bFillAndRemoveEdges = (bFillAndRemoveEdges ? FALSE : TRUE);
  1190.                     goto _HUpdate;
  1191.                     break;
  1192.  
  1193.                 case IDRESET:
  1194.                     iHoles = 0;
  1195.                     goto _HUpdate;
  1196.                     break;
  1197.  
  1198.                 case IDOK:    // Fin dialogue
  1199.                     hHoleDlgActive = NULL;
  1200.                     SendDlgItemMessage(hWnd, IDC_SH, WM_GETTEXT, sizeof(cBuf) - 1, (LPARAM) cBuf); iHoles = atoi(cBuf);
  1201.                     if (iHoles >= XDC_MAX_HOLES)
  1202.                     {
  1203.                         vTrace("*** E0009 : trop de trous");
  1204.                         iHoles = 0;
  1205.                     }
  1206.                     EndDialog(hWnd, 0);
  1207.                     break;
  1208.              }
  1209.              return TRUE;
  1210.              break;
  1211.  
  1212.          case WM_INITDIALOG :
  1213.             hHoleDlgActive = hWnd;
  1214.             iHoles = 0;
  1215.  
  1216.          case WM_USER + 1:
  1217. _HUpdate:
  1218.             SendDlgItemMessage(hWnd, IDC_FADE, BM_SETCHECK, (WPARAM) bFillAndRemoveEdges, 0L);
  1219.              sprintf(cBuf, "%d", iHoles);  SendDlgItemMessage(hWnd, IDC_SH, WM_SETTEXT, 0, (LPARAM) cBuf);
  1220.  
  1221. #ifndef _AMIGA_
  1222.             SetForegroundWindow(hWnd);
  1223. #endif
  1224.  
  1225.             return TRUE;
  1226.     }
  1227.     return FALSE;
  1228. }
  1229.  
  1230. ////////////////////// S A I S I E   1   P A R A M E T R E  ////////////////////////////////////////////
  1231. BOOL CALLBACK bStringDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1232. {
  1233.     int wmId;
  1234.  
  1235.     switch( uMsg )
  1236.     {
  1237.     case WM_COMMAND :
  1238.          wmId    = LOWORD(wParam);
  1239.          switch (wmId)
  1240.          {
  1241.             case IDCANCEL:
  1242.                 EndDialog(hWnd, -1);
  1243.                 break;
  1244.  
  1245.             case IDOK:    // Fin dialogue
  1246.                 SendDlgItemMessage(hWnd, IDC_SH, WM_GETTEXT, sizeof(cString) - 1, (LPARAM) cString);
  1247.                 EndDialog(hWnd, 0);
  1248.                 break;
  1249.          }
  1250.          return TRUE;
  1251.          break;
  1252.  
  1253.      case WM_INITDIALOG :
  1254.          SendDlgItemMessage(hWnd, IDC_SH, WM_SETTEXT, 0, (LPARAM) cString);
  1255.          return TRUE;
  1256.          break;
  1257.     }
  1258.  
  1259.     return FALSE;
  1260. }
  1261.  
  1262. ////////////////////// H I N T S  W 3 D ////////////////////////////////////////////
  1263. BOOL CALLBACK bHintDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1264. {
  1265.     int wmId;
  1266.     static UBYTE uHintBack[10];
  1267.  
  1268.     switch( uMsg )
  1269.     {
  1270.     case WM_COMMAND :
  1271.          wmId    = LOWORD(wParam);
  1272.  
  1273.          switch (wmId)
  1274.          {
  1275.             case IDC_TEXMAPPING_FAST :
  1276.             case IDC_TEXMAPPING_AVERAGE :
  1277.             case IDC_TEXMAPPING_NICE :
  1278.                 uHint[0] = (wmId == IDC_TEXMAPPING_FAST ? W3D_H_FAST : (wmId == IDC_TEXMAPPING_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1279.                 SendDlgItemMessage(hWnd, IDC_TEXMAPPING_FAST,    BM_SETCHECK, (WPARAM) (uHint[0] == W3D_H_FAST),    0L);
  1280.                 SendDlgItemMessage(hWnd, IDC_TEXMAPPING_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[0] == W3D_H_AVERAGE), 0L);
  1281.                 SendDlgItemMessage(hWnd, IDC_TEXMAPPING_NICE,    BM_SETCHECK, (WPARAM) (uHint[0] == W3D_H_NICE),    0L);
  1282.                 goto __Hints_Done;
  1283.  
  1284.             case IDC_MIPMAPPING_FAST :
  1285.             case IDC_MIPMAPPING_AVERAGE :
  1286.             case IDC_MIPMAPPING_NICE :
  1287.                 uHint[1] = (wmId == IDC_MIPMAPPING_FAST ? W3D_H_FAST : (wmId == IDC_MIPMAPPING_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1288.                 SendDlgItemMessage(hWnd, IDC_MIPMAPPING_FAST,    BM_SETCHECK, (WPARAM) (uHint[1] == W3D_H_FAST),    0L);
  1289.                 SendDlgItemMessage(hWnd, IDC_MIPMAPPING_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[1] == W3D_H_AVERAGE), 0L);
  1290.                 SendDlgItemMessage(hWnd, IDC_MIPMAPPING_NICE,    BM_SETCHECK, (WPARAM) (uHint[1] == W3D_H_NICE),    0L);
  1291.                 goto __Hints_Done;
  1292.  
  1293.             case IDC_BILINEARFILTER_FAST :
  1294.             case IDC_BILINEARFILTER_AVERAGE :
  1295.             case IDC_BILINEARFILTER_NICE :
  1296.                 uHint[2] = (wmId == IDC_BILINEARFILTER_FAST ? W3D_H_FAST : (wmId == IDC_BILINEARFILTER_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1297.                 SendDlgItemMessage(hWnd, IDC_BILINEARFILTER_FAST,    BM_SETCHECK, (WPARAM) (uHint[2] == W3D_H_FAST),    0L);
  1298.                 SendDlgItemMessage(hWnd, IDC_BILINEARFILTER_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[2] == W3D_H_AVERAGE), 0L);
  1299.                 SendDlgItemMessage(hWnd, IDC_BILINEARFILTER_NICE,    BM_SETCHECK, (WPARAM) (uHint[2] == W3D_H_NICE),    0L);
  1300.                 goto __Hints_Done;
  1301.  
  1302.             case IDC_MMFILTER_FAST :
  1303.             case IDC_MMFILTER_AVERAGE :
  1304.             case IDC_MMFILTER_NICE :
  1305.                 uHint[3] = (wmId == IDC_MMFILTER_FAST ? W3D_H_FAST : (wmId == IDC_MMFILTER_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1306.                 SendDlgItemMessage(hWnd, IDC_MMFILTER_FAST,    BM_SETCHECK, (WPARAM) (uHint[3] == W3D_H_FAST),    0L);
  1307.                 SendDlgItemMessage(hWnd, IDC_MMFILTER_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[3] == W3D_H_AVERAGE), 0L);
  1308.                 SendDlgItemMessage(hWnd, IDC_MMFILTER_NICE,    BM_SETCHECK, (WPARAM) (uHint[3] == W3D_H_NICE),    0L);
  1309.                 goto __Hints_Done;
  1310.  
  1311.             case IDC_PERSPECTIVE_FAST :
  1312.             case IDC_PERSPECTIVE_AVERAGE :
  1313.             case IDC_PERSPECTIVE_NICE :
  1314.                 uHint[4] = (wmId == IDC_PERSPECTIVE_FAST ? W3D_H_FAST : (wmId == IDC_PERSPECTIVE_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1315.                 SendDlgItemMessage(hWnd, IDC_PERSPECTIVE_FAST,    BM_SETCHECK, (WPARAM) (uHint[4] == W3D_H_FAST),    0L);
  1316.                 SendDlgItemMessage(hWnd, IDC_PERSPECTIVE_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[4] == W3D_H_AVERAGE), 0L);
  1317.                 SendDlgItemMessage(hWnd, IDC_PERSPECTIVE_NICE,    BM_SETCHECK, (WPARAM) (uHint[4] == W3D_H_NICE),    0L);
  1318.                 goto __Hints_Done;
  1319.  
  1320.             case IDC_BLENDING_FAST :
  1321.             case IDC_BLENDING_AVERAGE :
  1322.             case IDC_BLENDING_NICE :
  1323.                 uHint[5] = (wmId == IDC_BLENDING_FAST ? W3D_H_FAST : (wmId == IDC_BLENDING_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1324.                 SendDlgItemMessage(hWnd, IDC_BLENDING_FAST,    BM_SETCHECK, (WPARAM) (uHint[5] == W3D_H_FAST),    0L);
  1325.                 SendDlgItemMessage(hWnd, IDC_BLENDING_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[5] == W3D_H_AVERAGE), 0L);
  1326.                 SendDlgItemMessage(hWnd, IDC_BLENDING_NICE,    BM_SETCHECK, (WPARAM) (uHint[5] == W3D_H_NICE),    0L);
  1327.                 goto __Hints_Done;
  1328.  
  1329.             case IDC_FOGGING_FAST :
  1330.             case IDC_FOGGING_AVERAGE :
  1331.             case IDC_FOGGING_NICE :
  1332.                 uHint[6] = (wmId == IDC_FOGGING_FAST ? W3D_H_FAST : (wmId == IDC_FOGGING_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1333.                 SendDlgItemMessage(hWnd, IDC_FOGGING_FAST,    BM_SETCHECK, (WPARAM) (uHint[6] == W3D_H_FAST),    0L);
  1334.                 SendDlgItemMessage(hWnd, IDC_FOGGING_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[6] == W3D_H_AVERAGE), 0L);
  1335.                 SendDlgItemMessage(hWnd, IDC_FOGGING_NICE,    BM_SETCHECK, (WPARAM) (uHint[6] == W3D_H_NICE),    0L);
  1336.                 goto __Hints_Done;
  1337.  
  1338.             case IDC_ANTIALIASING_FAST :
  1339.             case IDC_ANTIALIASING_AVERAGE :
  1340.             case IDC_ANTIALIASING_NICE :
  1341.                 uHint[7] = (wmId == IDC_ANTIALIASING_FAST ? W3D_H_FAST : (wmId == IDC_ANTIALIASING_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1342.                 SendDlgItemMessage(hWnd, IDC_ANTIALIASING_FAST,    BM_SETCHECK, (WPARAM) (uHint[7] == W3D_H_FAST),    0L);
  1343.                 SendDlgItemMessage(hWnd, IDC_ANTIALIASING_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[7] == W3D_H_AVERAGE), 0L);
  1344.                 SendDlgItemMessage(hWnd, IDC_ANTIALIASING_NICE,    BM_SETCHECK, (WPARAM) (uHint[7] == W3D_H_NICE),    0L);
  1345.                 goto __Hints_Done;
  1346.  
  1347.             case IDC_DITHERING_FAST :
  1348.             case IDC_DITHERING_AVERAGE :
  1349.             case IDC_DITHERING_NICE :
  1350.                 uHint[8] = (wmId == IDC_DITHERING_FAST ? W3D_H_FAST : (wmId == IDC_DITHERING_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1351.                 SendDlgItemMessage(hWnd, IDC_DITHERING_FAST,    BM_SETCHECK, (WPARAM) (uHint[8] == W3D_H_FAST),    0L);
  1352.                 SendDlgItemMessage(hWnd, IDC_DITHERING_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[8] == W3D_H_AVERAGE), 0L);
  1353.                 SendDlgItemMessage(hWnd, IDC_DITHERING_NICE,    BM_SETCHECK, (WPARAM) (uHint[8] == W3D_H_NICE),    0L);
  1354.                 goto __Hints_Done;
  1355.  
  1356.             case IDC_ZBUFFER_FAST :
  1357.                case IDC_ZBUFFER_AVERAGE :
  1358.             case IDC_ZBUFFER_NICE :
  1359.                 uHint[9] = (wmId == IDC_ZBUFFER_FAST ? W3D_H_FAST : (wmId == IDC_ZBUFFER_AVERAGE ? W3D_H_AVERAGE : W3D_H_NICE));
  1360.                 SendDlgItemMessage(hWnd, IDC_ZBUFFER_FAST,    BM_SETCHECK, (WPARAM) (uHint[9] == W3D_H_FAST),    0L);
  1361.                 SendDlgItemMessage(hWnd, IDC_ZBUFFER_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[9] == W3D_H_AVERAGE), 0L);
  1362.                 SendDlgItemMessage(hWnd, IDC_ZBUFFER_NICE,    BM_SETCHECK, (WPARAM) (uHint[9] == W3D_H_NICE),    0L);
  1363. __Hints_Done:
  1364.                 vSetHints();
  1365.                 vForce3DRefresh(XDC_MODE_COMPLET);
  1366.                 break;
  1367.  
  1368.             // Annuler
  1369.             case IDCANCEL:
  1370.                 memcpy(uHint, uHintBack, sizeof(uHint));
  1371.             case IDOK:
  1372.                 vSetHints();
  1373.                 bSaveHints();
  1374.                 EndDialog(hWnd, 0);
  1375.                 break;
  1376.          }
  1377.          return TRUE;
  1378.  
  1379.      case WM_INITDIALOG :
  1380.         memcpy(uHintBack, uHint, sizeof(uHint));
  1381.         SendDlgItemMessage(hWnd, IDC_TEXMAPPING_FAST,        BM_SETCHECK, (WPARAM) (uHint[0] == W3D_H_FAST),    0L);
  1382.         SendDlgItemMessage(hWnd, IDC_TEXMAPPING_AVERAGE,     BM_SETCHECK, (WPARAM) (uHint[0] == W3D_H_AVERAGE), 0L);
  1383.         SendDlgItemMessage(hWnd, IDC_TEXMAPPING_NICE,        BM_SETCHECK, (WPARAM) (uHint[0] == W3D_H_NICE),    0L);
  1384.          SendDlgItemMessage(hWnd, IDC_MIPMAPPING_FAST,        BM_SETCHECK, (WPARAM) (uHint[1] == W3D_H_FAST),    0L);
  1385.         SendDlgItemMessage(hWnd, IDC_MIPMAPPING_AVERAGE,     BM_SETCHECK, (WPARAM) (uHint[1] == W3D_H_AVERAGE), 0L);
  1386.         SendDlgItemMessage(hWnd, IDC_MIPMAPPING_NICE,        BM_SETCHECK, (WPARAM) (uHint[1] == W3D_H_NICE),    0L);
  1387.          SendDlgItemMessage(hWnd, IDC_BILINEARFILTER_FAST,    BM_SETCHECK, (WPARAM) (uHint[2] == W3D_H_FAST),    0L);
  1388.         SendDlgItemMessage(hWnd, IDC_BILINEARFILTER_AVERAGE, BM_SETCHECK, (WPARAM) (uHint[2] == W3D_H_AVERAGE), 0L);
  1389.         SendDlgItemMessage(hWnd, IDC_BILINEARFILTER_NICE,    BM_SETCHECK, (WPARAM) (uHint[2] == W3D_H_NICE),    0L);
  1390.          SendDlgItemMessage(hWnd, IDC_MMFILTER_FAST,          BM_SETCHECK, (WPARAM) (uHint[3] == W3D_H_FAST),    0L);
  1391.         SendDlgItemMessage(hWnd, IDC_MMFILTER_AVERAGE,       BM_SETCHECK, (WPARAM) (uHint[3] == W3D_H_AVERAGE), 0L);
  1392.         SendDlgItemMessage(hWnd, IDC_MMFILTER_NICE,          BM_SETCHECK, (WPARAM) (uHint[3] == W3D_H_NICE),    0L);
  1393.          SendDlgItemMessage(hWnd, IDC_PERSPECTIVE_FAST,       BM_SETCHECK, (WPARAM) (uHint[4] == W3D_H_FAST),    0L);
  1394.         SendDlgItemMessage(hWnd, IDC_PERSPECTIVE_AVERAGE,    BM_SETCHECK, (WPARAM) (uHint[4] == W3D_H_AVERAGE), 0L);
  1395.         SendDlgItemMessage(hWnd, IDC_PERSPECTIVE_NICE,       BM_SETCHECK, (WPARAM) (uHint[4] == W3D_H_NICE),    0L);
  1396.          SendDlgItemMessage(hWnd, IDC_BLENDING_FAST,          BM_SETCHECK, (WPARAM) (uHint[5] == W3D_H_FAST),    0L);
  1397.         SendDlgItemMessage(hWnd, IDC_BLENDING_AVERAGE,       BM_SETCHECK, (WPARAM) (uHint[5] == W3D_H_AVERAGE), 0L);
  1398.         SendDlgItemMessage(hWnd, IDC_BLENDING_NICE,          BM_SETCHECK, (WPARAM) (uHint[5] == W3D_H_NICE),    0L);
  1399.          SendDlgItemMessage(hWnd, IDC_FOGGING_FAST,           BM_SETCHECK, (WPARAM) (uHint[6] == W3D_H_FAST),    0L);
  1400.         SendDlgItemMessage(hWnd, IDC_FOGGING_AVERAGE,        BM_SETCHECK, (WPARAM) (uHint[6] == W3D_H_AVERAGE), 0L);
  1401.         SendDlgItemMessage(hWnd, IDC_FOGGING_NICE,           BM_SETCHECK, (WPARAM) (uHint[6] == W3D_H_NICE),    0L);
  1402.          SendDlgItemMessage(hWnd, IDC_ANTIALIASING_FAST,      BM_SETCHECK, (WPARAM) (uHint[7] == W3D_H_FAST),    0L);
  1403.         SendDlgItemMessage(hWnd, IDC_ANTIALIASING_AVERAGE,   BM_SETCHECK, (WPARAM) (uHint[7] == W3D_H_AVERAGE), 0L);
  1404.         SendDlgItemMessage(hWnd, IDC_ANTIALIASING_NICE,      BM_SETCHECK, (WPARAM) (uHint[7] == W3D_H_NICE),    0L);
  1405.          SendDlgItemMessage(hWnd, IDC_DITHERING_FAST,         BM_SETCHECK, (WPARAM) (uHint[8] == W3D_H_FAST),    0L);
  1406.         SendDlgItemMessage(hWnd, IDC_DITHERING_AVERAGE,      BM_SETCHECK, (WPARAM) (uHint[8] == W3D_H_AVERAGE), 0L);
  1407.         SendDlgItemMessage(hWnd, IDC_DITHERING_NICE,         BM_SETCHECK, (WPARAM) (uHint[8] == W3D_H_NICE),    0L);
  1408.          SendDlgItemMessage(hWnd, IDC_ZBUFFER_FAST,           BM_SETCHECK, (WPARAM) (uHint[9] == W3D_H_FAST),    0L);
  1409.         SendDlgItemMessage(hWnd, IDC_ZBUFFER_AVERAGE,        BM_SETCHECK, (WPARAM) (uHint[9] == W3D_H_AVERAGE), 0L);
  1410.         SendDlgItemMessage(hWnd, IDC_ZBUFFER_NICE,           BM_SETCHECK, (WPARAM) (uHint[9] == W3D_H_NICE),    0L);
  1411.         return TRUE;
  1412.     }
  1413.     return FALSE;
  1414. }
  1415.  
  1416.